package com.time.admin.application.controller;

import com.google.common.base.Preconditions;
import com.time.admin.application.converter.TagDTOConverter;
import com.time.admin.application.dto.TagDTO;
import com.time.admin.common.entity.PageResult;
import com.time.admin.domain.entity.TagBO;
import com.time.admin.domain.service.AdminTagDomainService;
import com.time.auth.entity.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * 标签管理控制层类
 *
 * @author: HuangQi
 * @date: Created in 11:09 2025/10/14
 * @description: 标签管理控制层
 */
@Slf4j
@RestController
@RequestMapping("/admin/tag/")
public class TagController {

    @Autowired
    private AdminTagDomainService adminTagDomainService;


    /**
     * 新增标签
     *
     * @param tagDTO 新增标签信息
     * @return 新增结果
     */
    @PostMapping("add")
    public Result<Boolean> add(@RequestBody TagDTO tagDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.TagController.add.dto:{}", tagDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(tagDTO.getTagName(), "标签的名称不能为空");
            Preconditions.checkNotNull(tagDTO.getTagColor(), "标签的颜色不能为空");

            // 调用领域层
            TagBO tagBO = TagDTOConverter.INSTANCE.convertDTOToBO(tagDTO);
            Boolean addResult = adminTagDomainService.add(tagBO);

            // 返回结果
            return Result.ok(addResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.TagController.add.error:{}", e.getMessage(), e);
            return Result.fail("管理模块新增标签失败");
        }
    }

    /**
     * 更新标签
     *
     * @param tagDTO 更新标签的信息
     * @return 更新结果
     */
    @PostMapping("update")
    public Result<Boolean> update(@RequestBody TagDTO tagDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.TagController.update.dto:{}", tagDTO);
            }
            // 参数校验
            Preconditions.checkNotNull(tagDTO.getTagId(), "标签的id不能为空");
            Preconditions.checkNotNull(tagDTO.getTagName(), "标签的名称不能为空");
            Preconditions.checkNotNull(tagDTO.getTagColor(), "标签的颜色不能为空");

            // 调用领域层
            TagBO tagBO = TagDTOConverter.INSTANCE.convertDTOToBO(tagDTO);
            Boolean updateResult = adminTagDomainService.update(tagBO);

            // 返回结果
            return Result.ok(updateResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.TagController.update.error:{}", e.getMessage(), e);
            return Result.fail("管理模块更新标签失败");
        }
    }

    /**
     * 删除标签
     *
     * @param id 删除标签的id
     * @return 删除结果
     */
    @PostMapping("delete/{id}")
    public Result<Boolean> delete(@PathVariable("id") Long id) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.TagController.delete.id:{}", id);
            }
            // 参数校验
            Preconditions.checkNotNull(id, "标签的id不能为空");

            // 调用领域层
            Boolean deleteResult = adminTagDomainService.delete(id);

            // 返回结果
            return Result.ok(deleteResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.TagController.delete.error:{}", e.getMessage(), e);
            return Result.fail("管理模块删除标签失败");
        }
    }

    /**
     * 分页查询所有标签
     *
     * @param tagDTO 分页查询所有标签信息
     * @return 分页标签信息结果
     */
    @PostMapping("queryAll")
    public Result<PageResult<TagDTO>> queryAllTag(@RequestBody TagDTO tagDTO) {
        try {
            if (log.isInfoEnabled()) {
                log.info("Admin.TagController.queryAllTag.dto: {}", tagDTO);
            }

            // 调用领域层
            TagBO tagBO = TagDTOConverter.INSTANCE.convertDTOToBO(tagDTO);
            PageResult<TagBO> infoBOPageResult = adminTagDomainService.queryAllTag(tagBO);

            // 返回结果
            PageResult<TagDTO> infoDTOPageResult = TagDTOConverter.INSTANCE.convertBOPageToDTOPage(infoBOPageResult);
            return Result.ok(infoDTOPageResult);
        } catch (Exception e) {
            // 异常处理
            log.error("Admin.TagController.queryAllTag.error:{}", e.getMessage(), e);
            return Result.fail("管理模块分页获取所有标签失败");
        }
    }
}
